//#include <stdio.h>
//#include <unistd.h>
//
//int main()
//{
//    pid_t pid;
//    printf("fork 前: pid == %d\n", getpid());
//    pid = fork();
//    printf("fork 后:pid == %d, fork 返回: %d\n", getpid(), pid);
//    sleep(1);
//    return 0;
//}
//#include <unistd.h>
//#include <stdio.h>
//
//int main()
//{
//    int a = 0;
//    scanf("%d", &a);
//    printf("---------------------");
//    if (a == 0) exit(1);
//    else if (a == 1) _exit(1);
//    else return 0;
//}

//#include <sys/wait.h>
//#include <unistd.h>
//#include <stdio.h>
//int main()
//{
//    sleep(2);
//    int pid = fork();
//    if (pid) // 父进程逻辑
//    {
//        sleep(4);
//        printf("父进程开始等待\n");
//        pid = wait(NULL);
//        printf("父进程等待成功, 接收到的 pid: %d\n", pid);
//        sleep(2);
//    }
//    else // 子进程逻辑
//    {
//        pid = getpid();
//        int cnt = 2;
//        while(cnt--)
//        {
//            sleep(1);
//            printf("我是子进程, pid: %d\n", pid);
//        }
//    }
//
//    return 0;
//}

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid = fork();
    if ( pid == 0 ) // 子进程
    {
        sleep(3);
        int a = 10;
        a /= 0;
        //exit(114);
    }
    else // 父进程
    {
        int state;
        int ret = wait(&state);
        printf("state 0 ~ 15 位: %016b\n", state);
        if (ret > 0 && (state & 0X7F) == 0) // 正常退出
        {
            printf("正常退出, 子进程退出码: %d\n", (state >> 8) & 0XFF);
        }
        else if (ret > 0) // 异常退出
        {
            printf("因信号退出, 信号编号: %d\n", state & 0X7F );
        }
    }
    return 0;
}
